#include<iostream>
#include<vector>
using namespace std;

// 用于最长不上升子序列的二分查找
int bis(vector<int>& low, int x) {
    int l = 0, r = low.size() - 1;
    while(l < r) {
        int mid = (l + r) >> 1;
        if(low[mid] < x)  // 寻找第一个小于x的位置
            r = mid;
        else 
            l = mid + 1;
    }
    return l;
}

// 用于最长上升子序列的二分查找
int bbs(vector<int>& llw, int x) {
    int l = 0, r = llw.size() - 1;
    while(l < r) {
        int mid = (l + r) >> 1;
        if(llw[mid] >= x)  // 寻找第一个大于等于x的位置
            r = mid;
        else 
            l = mid + 1;
    }
    return l;
}

int main() {
    int x;
    vector<int> a;
    while(cin >> x)    a.push_back(x);
    
    if(a.empty()) {  // 处理空输入
        cout << "0\n0";
        return 0;
    }
    
    // 第一部分：求最长不上升子序列（一套系统最多拦截的导弹数）
    vector<int> low;
    low.push_back(a[0]);
    for(int i = 1; i < a.size(); i++) {  // 从i=1开始，避免重复处理
        if(a[i] <= low.back())
            low.push_back(a[i]);
        else    low[bis(low, a[i])] = a[i];
    }
    
    // 第二部分：求最长上升子序列（最少需要的系统数）
    vector<int> llw;
    llw.push_back(a[0]);
    for(int i = 1; i < a.size(); i++) {  // 从i=1开始，避免重复处理
        if(a[i] > llw.back())
            llw.push_back(a[i]);
        else    llw[bbs(llw, a[i])] = a[i];
    }
    
    // 输出结果
    cout << low.size() << endl << llw.size() << endl;
    return 0;
}
